package facade_jss;
/*
 * TV나 Audio 등이 저차원 클래스라면, Home은 저차원 클래스들을 감싸고 있는 고차원 클래스 입니다. 
 * 실질적인 저차원 클래스들의 조합은 바로 고차원 클래스인 Home클래스가 담당합니다.
 * 클라이언트인 Main클래스는 고차원 클래스만 신경씁니다. 
 * 
 *  Home 클래스 안에다가 기능을 다 넣을 수도 있었습니다. 그런데, TV가 꼭 Home에 종속되어야 할까요? 요즘은 핸드폰으로도 TV보는 세상인데요. 
Facade 패턴을 사용하면 최소단위로 클래스를 설계할 수 있습니다. 물론, 지나치게 잘게 쪼개는 것도 그다지 바람직하진 않습니다 . 
코드를 다른 데에 복사해서 사용하지 않는 선 정도에서 클래스를 분리시키면 될 것 같습니다.
예제코드의 경우 TV를 분리시키지 않는다면 핸드폰 클래스가 나왔을 때, 핸드폰 클래스의 TV기능을 다시 구현해야하는 사태가 발생합니다.
 * */
public class Home {
	private Tv tv;
	private Light light;
	private Audio audio;
	
	public Home(Audio audio, Light light, Tv tv){
		this.tv = tv;
		this.light = light;
		this.audio = audio;
	}
	
	public void enjoyTv(){
		System.out.println("==불을 밝게하고 TV보기.");
		light.setLightness(5);
		tv.turnOn();
	}
	public void enjoyMusic(){
		System.out.println("==불을 약간 어둡게하고 음악듣기.");
		light.setLightness(1);
		audio.play();
	}
	public void goOut(){
		System.out.println("==TV끄고, 음악도 끄고, 불도 끄고 외출하기.");
		tv.turnOff();
		audio.stop();
		light.setLightness(0);
	}
	
}
